package com.atguigu.ssyx.product.service.impl;

import com.atguigu.ssyx.common.utils.DateUtil;
import com.atguigu.ssyx.common.config.minio.properties.MinioProperties;
import com.atguigu.ssyx.product.service.FileUploadService;
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.Date;
import java.util.UUID;

/**
 * @author 杨林
 * @create 2023-07-24 14:53 星期一
 * description:
 */
@Service
@Slf4j
public class FileUploadServiceImpl implements FileUploadService {

//    @Value("${app.minio.endpoint}")
//    String endpoint;
//
//    @Value("${app.minio.access-key}")
//    String accessKey;
//
//    @Value("${app.minio.secret-key}")
//    String secretKey;
//
//    @Value("${app.minio.bucket-name}")
//    String bucketName;
    
    @Autowired
    MinioProperties minioProperties;
    
    @Autowired
    MinioClient minioClient;
    
    /**
     * 将文件上传到Minio并返回文件对应的URL
     * @param file
     * @return
     */
    @Override
    public String upload(MultipartFile file) throws Exception {
        /**
         * Minio优化：
         *  优化1：为每个上传的文件生成一个UUID，并以当天时间为文件夹，防止同名文件覆盖
         *  优化2：将Minio的相关配置抽取到配置文件，有利于相关配置的修改
         *  优化3：将相关配置属性抽取出来，放在MinioProperties中，并与配置文件中的属性值进行绑定
         *  优化4：SpringBoot配置抽取
         *      很多场景下都需要将一些属性放到配置文件中，而不是硬编码，使用 @ConfigurationProperties + Bean类
         *  优化5：将Minio相关配置抽取到 service-util中，方便其他模块使用，并且将Minio相关操作封装成注解
         */
        
        //1、创建MinioClient
//        MinioClient minioClient = new MinioClient("http://192.168.10.128:9000",
//                "admin",
//                "admin123456");     
//        MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);
//        MinioClient minioClient = new MinioClient(minioProperties.getEndpoint(), minioProperties.getAccessKey(), minioProperties.getSecretKey());

        //2、判断Bucket是否存在
//        boolean isExist = minioClient.bucketExists("ssyx-oss");
//        boolean isExist = minioClient.bucketExists(bucketName);
        
        //判断操作抽取到创建客户端的配置类中，避免每次调用上传接口都执行该操作
//        boolean isExist = minioClient.bucketExists(minioProperties.getBucketName());
//
//        if (isExist){
//            log.info("桶已经存在，可以直接上传");    
//        }else {
//            //3、创建一个名为 "ssyx-oss" 的存储桶
////            minioClient.makeBucket("ssyx-oss");
////            minioClient.makeBucket(bucketName);
//            minioClient.makeBucket(minioProperties.getBucketName());
//        }
        
        //4、使用putObject上传一个文件到这个桶中
        //4.1使用UUID随机生成文件名：防止同名文件覆盖
//        String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
        //
        String date = DateUtil.formatDate(new Date());
        String fileName = date + "/" +UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
        InputStream inputStream = file.getInputStream();
        PutObjectOptions options = new PutObjectOptions(file.getSize(), -1L);
        options.setContentType(file.getContentType());

        //上传文件
//        minioClient.putObject("ssyx-oss",fileName,inputStream,options);
//        minioClient.putObject(bucketName,fileName,inputStream,options);
        minioClient.putObject(minioProperties.getBucketName(),fileName,inputStream,options);
        
        //返回访问地址
//        String url = "http://192.168.10.128:9000/ssyx-oss/" + fileName; 
//        String url = endpoint + "/" + bucketName + "/"  + fileName; 
        String url = minioProperties.getEndpoint() + "/" + minioProperties.getBucketName() + "/"  + fileName; 
        
        return url;
    }
}
